package main	

import "fmt"

func fn1() {
	fmt.Println("开始")

	defer func() {
		fmt.Println("aaaaa")
	}()
	fmt.Println("结束")
}

// 调用方法返回值为0
// 在这个函数里面 第二a是局部变量，这个改变影响不了第一个a
// 所以这里即使defer最后执行，也不会影响到a的值
func fn2() int {
	var a int

	defer func() {
		a++
	}()
	return a
}

// 调用方法返回值为1
// 这里的a是函数的全局变量，所以defer最后执行的时候，a的值会被修改
func fn3() (a int) {
	defer func() {
		a++
	}()
	return a
}

func calc(intdex string, a, b int) int {
	ret := a + b
	fmt.Println(intdex, a, b, ret)
	return ret
}

func main() {
	fmt.Println("开始")
	fmt.Println("1")
	defer fmt.Println("2")
	fmt.Println("结束")
	fn1()

	fmt.Println(fn2()) //匿名函数的返回值是0  操作以前的值
	fmt.Println(fn3()) //命名函数的返回值是1  操作以后的值

	x := 1
	y := 2
	defer calc("AA", x, calc("A", x, y))
	x = 10
	defer calc("BB", x, calc("B", x, y))
	y = 20
}


/*
defer注册要延迟执行的函数时该函数所有的参数都需要确定其值

注册顺序
  defer calc("AA", x, calc("A", x, y))
  defer calc("BB", x, calc("B", x, y))

执行顺序
calc("A", 1, 2, 3) A 1 2 3
calc("B", 10, 20, 30) B 10 2 12
calc("BB", x, calc("B", x, y)) BB 10 12 22
calc("AA", x, calc("A", x, y)) AA 1 3 4

*/
